#!/bin/bash
###############################################################################
#       脚本名称: filter_pattern.sh
#       功能描述: 正则表达式过滤器,根据内容模式过滤日志
#       作者: 林再来
#       日期: 2025-10-14
#       版本: 1.0
#       功能:
#           1、包含模式过滤(include)
#           2、排除模式过滤(exclude)
#           3、支持多个正则表达式
#           4、支持字段级别的模式匹配
#       依赖(插件/命令):
#           grep(正则匹配)
###############################################################################

# 防止重复加载
[[ -n "${_FILTER_PATTERN_LOADED:-}" ]] && return 0
readonly _FILTER_PATTERN_LOADED=1

#-----------------------------------------------------------------------------
# 全局变量
#-----------------------------------------------------------------------------
# 包含模式列表
declare -gA _FILTER_PATTERN_INCLUDE
# 排除模式列表
declare -gA _FILTER_PATTERN_EXCLUDE

#-----------------------------------------------------------------------------
# 函数: 初始化模式过滤器
# 参数: $1 - 过滤器名称
# 返回: 0-成功
#-----------------------------------------------------------------------------
function _filter_pattern_init() {
    local filter_name="$1"
    
    # 初始化为空
    _FILTER_PATTERN_INCLUDE["$filter_name"]=""
    _FILTER_PATTERN_EXCLUDE["$filter_name"]=""
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 添加包含模式
# 参数: $1 - 过滤器名称
#       $2 - 正则表达式模式
# 返回: 0-成功
# 说明: 日志消息必须匹配至少一个包含模式才能通过
#-----------------------------------------------------------------------------
function _filter_pattern_add_include() {
    local filter_name="$1"
    local pattern="$2"
    
    if [[ -z "${_FILTER_PATTERN_INCLUDE[$filter_name]}" ]]; then
        _FILTER_PATTERN_INCLUDE["$filter_name"]="$pattern"
    else
        _FILTER_PATTERN_INCLUDE["$filter_name"]+="|$pattern"
    fi
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 添加排除模式
# 参数: $1 - 过滤器名称
#       $2 - 正则表达式模式
# 返回: 0-成功
# 说明: 日志消息匹配任何排除模式都会被拒绝
#-----------------------------------------------------------------------------
function _filter_pattern_add_exclude() {
    local filter_name="$1"
    local pattern="$2"
    
    if [[ -z "${_FILTER_PATTERN_EXCLUDE[$filter_name]}" ]]; then
        _FILTER_PATTERN_EXCLUDE["$filter_name"]="$pattern"
    else
        _FILTER_PATTERN_EXCLUDE["$filter_name"]+="|$pattern"
    fi
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 清除所有模式
# 参数: $1 - 过滤器名称
# 返回: 0-成功
#-----------------------------------------------------------------------------
function _filter_pattern_clear() {
    local filter_name="$1"
    
    _FILTER_PATTERN_INCLUDE["$filter_name"]=""
    _FILTER_PATTERN_EXCLUDE["$filter_name"]=""
    
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 应用模式过滤
# 参数: $1 - 过滤器名称
#       $2 - 日志事件JSON
# 返回: 0-通过, 1-拒绝
#-----------------------------------------------------------------------------
function _filter_pattern_apply() {
    local filter_name="$1"
    local event="$2"
    
    # 提取消息内容
    local message=$(echo "$event" | grep -oP '(?<="message":")[^"]*' 2>/dev/null)
    
    # 检查排除模式(优先)
    local exclude_pattern="${_FILTER_PATTERN_EXCLUDE[$filter_name]}"
    if [[ -n "$exclude_pattern" ]]; then
        if echo "$message" | grep -E -q "$exclude_pattern" 2>/dev/null; then
            return 1  # 匹配排除模式,拒绝
        fi
    fi
    
    # 检查包含模式
    local include_pattern="${_FILTER_PATTERN_INCLUDE[$filter_name]}"
    if [[ -n "$include_pattern" ]]; then
        if echo "$message" | grep -E -q "$include_pattern" 2>/dev/null; then
            return 0  # 匹配包含模式,通过
        else
            return 1  # 不匹配包含模式,拒绝
        fi
    fi
    
    # 没有任何模式,默认通过
    return 0
}

#-----------------------------------------------------------------------------
# 函数: 获取过滤器配置
# 参数: $1 - 过滤器名称
# 返回: 输出配置信息
#-----------------------------------------------------------------------------
function _filter_pattern_info() {
    local filter_name="$1"
    
    echo "Pattern Filter: $filter_name"
    echo "  Include: ${_FILTER_PATTERN_INCLUDE[$filter_name]:-<none>}"
    echo "  Exclude: ${_FILTER_PATTERN_EXCLUDE[$filter_name]:-<none>}"
}

#-----------------------------------------------------------------------------
# 测试函数
#-----------------------------------------------------------------------------
function _filter_pattern_test() {
    echo "=== 正则模式过滤器测试 ==="
    
    echo ""
    echo "1. 初始化过滤器:"
    _filter_pattern_init "test_filter"
    echo "  ✓ 初始化成功"
    
    echo ""
    echo "2. 添加包含模式(只允许包含'user'或'login'的日志):"
    _filter_pattern_add_include "test_filter" "user"
    _filter_pattern_add_include "test_filter" "login"
    
    echo ""
    echo "3. 添加排除模式(排除包含'debug'或'test'的日志):"
    _filter_pattern_add_exclude "test_filter" "debug"
    _filter_pattern_add_exclude "test_filter" "test"
    
    echo ""
    echo "4. 显示过滤器配置:"
    _filter_pattern_info "test_filter" | sed 's/^/  /'
    
    echo ""
    echo "5. 测试不同消息的过滤结果:"
    
    local test_messages=(
        "用户登录成功"
        "user login success"
        "系统启动完成"
        "debug: user info"
        "test user data"
        "user profile updated"
    )
    
    for msg in "${test_messages[@]}"; do
        local test_event="{\"message\":\"$msg\"}"
        if _filter_pattern_apply "test_filter" "$test_event"; then
            echo "  ✓ 通过: $msg"
        else
            echo "  ✗ 拒绝: $msg"
        fi
    done
    
    echo ""
    echo "6. 清除所有模式并测试:"
    _filter_pattern_clear "test_filter"
    local test_event='{"message":"any message"}'
    if _filter_pattern_apply "test_filter" "$test_event"; then
        echo "  ✓ 无模式时默认通过"
    fi
}

# 如果直接执行此脚本,运行测试
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    _filter_pattern_test
fi

